<?php

namespace App\Http\Controllers\Test;

use App\Http\Controllers\Controller;
use App\Models\Dispatch;
use App\Service\Xunsearch\Xunsearch;

class XunsearchController extends Controller
{

    // 迅搜测试：添加，修改数据，查询数据
    public function initialize()
    {
        parent::initialize();
    }

    // 清理测试数据（已经使用，不能在清理）
    //  https://www.shenlanhui.com/test/xunsearch/clean
    public function sdfdfd_clean()
    {
        $search = new Xunsearch();
        //$search->setDb('dispatch')->clean();
        //$search->setDb('fresh')->clean();
        $search->setDb('news')->clean();

        return $this->success([], '清理测试数据完成！');
    }

    //TODO 添加(这里添加需要先删除在添加，不能直接添加)
    public function sdfdfd_add()
    {
        // 查询快讯
        $dispatch = (new Dispatch())->setDb('dispatch');
        $lists    = $dispatch->where('id', "<", 20)->get()->toArray();
        $allNum   = [11, 111, 1111, 11111, 111111];
        $search   = (new Xunsearch())->setDb('dispatch');

        // 在uid上面添加几个数字，构建多个用户的，用于测试查询
        foreach($lists as $key => $item){
            $_rand = rand(0, 3);
            $uid   = $item['uid'];

            // 判断是否已经采集
            $query  = "id:{$item['id']}";
            $result = $search->search($query);
            if(!empty($result)){
                break;
            }

            // 组合
            $lists[$key]['topic_id'] = rand(1, 5);
            if(empty($_rand)){
                $lists[$key]['stock_id'] = '，'.$uid.'，';
                //$lists[$key]['stock_id'] = json_encode([$uid]);
                continue;
            }

            $stock_id = [];
            for($ii = 0; $ii < $_rand; $ii++){
                $_number = rand(0, 4);
                if(!in_array($allNum[$_number], $stock_id)){
                    $stock_id[] = $allNum[$_number];
                }
            }

            // 重新组合
            $item['stock_id'] = '，'.implode('，', $stock_id).'，';
            //$lists[$key]['stock_id'] = '，'.implode('，', $stock_id).'，';
            //$lists[$key]['stock_id'] = json_encode($stock_id);

            // 创建索引
            $res = $search->add($item);
            if($res === false){
                $this->comment('  '.$search->getError());

                return false;
            }
        }

        // 添加到数据库搜索引擎
        /*$result = $search->batch($lists);
        if(empty($result)){
            return $this->error('添加失败！');
        }*/

        return $this->success($lists, '添加测试数据成功！');
    }

    // 搜索
    public function search()
    {
        // 1、可以指定搜索字段索引： index = both 或者 index = self
        // 2、type = body 不支持指定搜索字段索
        // 3、一个数据库中：最多只能有一个的两种字段类型  type = title 和 type = body
        // 4、type = string 在搜索的时候，如果是数组必须转换成字符串才能搜索
        // 5、如果是多个数字组合的字段，不用用英文的,_|等组合，因为查询的时候查询不出来，可以用中文的，；组合
        //    多个数字组合的在数字的前后都加上符号 如 ，1，2，
        $query = 'title:今年';
        $query = '公告';               // content:是body类型，不支持指定字段检索
        $query = 'title:今年 OR 公告';
        $query = 'title:今年 AND 公告';

        // 在Xunsearch配置的是字符串，所以这里必须是字符串才能执行成功
        $uid1  = '1';
        $uid2  = '10';
        $major = '0';
        $query = "is_major:{$major} OR uid={$uid1}";
        $query = "is_major:{$major}";
        $query = "uid:{$uid2}";  // 如果是
        $query = "uid:{$uid2} OR uid:{$uid1}";

        // 组合搜索
        // title:今年 OR 公告   指定title包含今年 或者 其他不指定字段包含公告
        $query = "(uid:{$uid2} OR uid:{$uid1}) AND (title:今年 OR 公告)";


        // 分词器：是用于in的
        $topicId = '1,2';
        $query   = "topic_id:{$topicId}";
        $query   = "uid:{$uid1} AND topic_id:{$topicId}";

        // 多个stock_id的新数据
        $stockId1 = '，1，';
        $stockId1 = '1，';
        //$stockId1 = '，3，';
        $query = "stock_id:{$stockId1}";

        // 测试命令行生成的数据
        $uid1  = 1;
        $query = "uid:{$uid1}";

        // 添加到数据库搜索引擎
        $search = (new Xunsearch())->setDb('dispatch');

        // 一般搜索
        $result = $search->search($query);

        // 增加区间搜索
        //$result = $search->addRange('ctime', 1683630546, 1683632105)->search($query);

        // 结果：数量
        $count = $search->count();
        if($result === false){
            return $this->error('搜索失败！');
        }

        return $this->success(['data' => $result, 'count' => $count]);
    }

    // 搜索id
    public function id()
    {
        $id     = 8773;
        $query  = "id:{$id}";
        $search = (new Xunsearch())->setDb('dispatch');
        $result = $search->search($query);
        $count  = $search->count();
        if($result === false){
            return $this->error('搜索失败！');
        }
        var_dump(empty($result));

        return $this->success(['data' => $result, 'count' => $count]);
    }

    // 查找最大的id
    public function max()
    {
        //$id = 98300;
        //$id = 98801;
        $search = (new Xunsearch())->setDb('dispatch');
        for($id = 90000; $id < 1000000; $id++){
            $query  = "id:{$id}";
            $max    = $id;
            $result = $search->search($query);
            if($result === false){
                return $this->error('搜索失败！');
            }
            if(empty($result)){
                break;
            }
        }

        return $this->success(['max' => $max]);
    }
}


